package com.soar.tbox.protocol;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;

import android.annotation.SuppressLint;

import com.soar.tbox.CommandStorage;
import com.soar.tbox.DisplayHandler;
import com.soar.tbox.Messenger;
import com.soar.tbox.TboxTimer;
import com.soar.tbox.bean.Command;
import com.soar.tbox.bean.Paramter;
import com.soar.tbox.util.Converts;
import com.soar.tbox.util.LogUtil;
import com.soar.tbox.util.SettingHelper;

/**
 * 数据采集上报_车辆位置定时上报指令处理
 * 
 * @author songjunjie
 * 
 */
public class Protocol0801 implements Protocol {
	/**
	 * 指令名. 车辆位置上报
	 */
	private static final String NAME = "0801";

	private Command cmd = null;
	private String serialNum = null;

	public Protocol0801(Command cmd, String serialNum) {
		this.cmd = cmd;
		this.serialNum = serialNum;
	}

	@SuppressLint("SimpleDateFormat")
	@Override
	public void handle() {
		DisplayHandler.show("执行车辆位置定时上报指令");
		int interval = 0;//时间间隔
		List<Paramter> paramlist1 = cmd.getParamterList();
		for (Paramter param : paramlist1) {
			byte[] key = param.getKey();
			if (key[0] == 0x0a) {// 此参数是时间间隔
				byte[] val = param.getValue();
				interval = Converts.uwordToInt(val);// 单位是秒
				break;
			}
		}
		final Command resultCommand ;
		try {
			resultCommand = getResultCommand();
		} catch (Exception e) {
			 LogUtil.error("", e);
			 e.printStackTrace();
			 DisplayHandler.show("发成异常" + e.getMessage());
			 return;
		}
		final int _interval = interval;
		TimerTask task = new TimerTask(){
			int errorCount = 0;//记录发送的指令时的错误次数
			boolean hasReport = false;//是否已经上报过，上报一次后为true
			@Override
			public void run() {
				Messenger messenger = new Messenger();
				if(errorCount>10){//发送10次都出现错误，取消此定时任务。
					this.cancel();
				}
				try {
					messenger.send(resultCommand, false);
					if(!hasReport){
						DisplayHandler.show("车辆为位置上报开始执行，每隔"+_interval+"秒，上报一次");
						hasReport = true;
					}
					errorCount = 0;//成功了，就将计数器清零
				} catch (Exception e) {
					if(!hasReport){
						DisplayHandler.show("车辆为位置上报时出错，在尝试10次后，如果一直失败，将停止执行");
						hasReport = true;
					}
					errorCount ++;
					LogUtil.error("上报车辆位置时出现错误", e);
					e.printStackTrace();
				}
			}
		};
		TboxTimer.schedule("0802", task, 0, interval);
	}

	private Command getResultCommand() throws Exception {
		Command resultCommand = CommandStorage.getCommand(NAME);
		List<Paramter> paramlist = resultCommand.getParamterList();
		// 给请求指令设置位置信息
		for (Paramter param : paramlist) {
			byte[] key = param.getKey();
			if (key[0] == 0x07) {// 表示是位置信息
				String position_info = SettingHelper.getSetting().get(
						"position_info");
				if (position_info == null || position_info.length() == 0) {
					throw new Exception(
							"车辆位置信息(position_info),没有在配置文件setting.xml配置.");
				}
				position_info = position_info.trim();
				SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
				String time = sdf.format(new Date());
				// 用当前时间替换位置信息中的gps时间参数.
				position_info.replaceAll("#time", time);
				byte[] val = position_info.getBytes();
				param.setValue(val);// 设置位置信息
				byte len = Converts.intToUbyte(val.length);
				param.setLen(new byte[] { len });// 设置参数长度
				break;
			}
		}
		return resultCommand;
	}
}